package com.example.domain.dto;

import com.example.domain.valueobject.Quantity;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 数量传输对象
 * 用于API响应中的数量字段
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class QuantityDTO {
    
    /**
     * 数量值
     * 示例: 5.5
     */
    private BigDecimal value;
    
    /**
     * 计量单位
     * 示例: "KG", "个", "斤"
     */
    private String unit;
    
    /**
     * 计量单位名称（用于前端显示）
     * 示例: "公斤", "斤", "个"
     */
    private String unitName;

    /**
     * 格式化后的数量字符串（可选）
     * 示例: "5.5 KG"
     */
    private String formatted;
    
    /**
     * 从Quantity值对象创建DTO
     * 
     * @param quantity 数量值对象
     * @return QuantityDTO
     */
    public static QuantityDTO from(Quantity quantity) {
        if (quantity == null) {
            return null;
        }
        return QuantityDTO.builder()
                .value(quantity.getValue())
                .unit(quantity.getUnit())
                .unitName(quantity.getUnitName())
                .formatted(quantity.format())
                .build();
    }
    
    /**
     * 转换为Quantity值对象
     * 
     * @return Quantity值对象
     */
    public Quantity toQuantity() {
        return Quantity.of(this.value, this.unit, this.unitName != null ? this.unitName : this.unit);
    }
    
    /**
     * 创建简单的数量DTO（仅包含数量值和单位）
     * 
     * @param quantity 数量值对象
     * @return QuantityDTO
     */
    public static QuantityDTO simple(Quantity quantity) {
        if (quantity == null) {
            return null;
        }
        return QuantityDTO.builder()
                .value(quantity.getValue())
                .unit(quantity.getUnit())
                .unitName(quantity.getUnitName())
                .build();
    }
    
    /**
     * 创建零数量
     * 
     * @param unit 计量单位
     * @return 零数量DTO
     */
    public static QuantityDTO zero(String unit, String unitName) {
        return QuantityDTO.builder()
                .value(BigDecimal.ZERO)
                .unit(unit)
                .unitName(unitName)
                .formatted("0 " + unitName)
                .build();
    }
}

